h1b_df <- DATA
SECTION 1: BACKGROUND
SLIDE 7: MAP
htmltools::includeHTML("rMaps.html")
SECTION 2: STEM
SLIDE 9: Stem and non-stem histogram
DATA %>%
group_by(year, stem) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
geom_bar(stat = "identity", position = position_stack(reverse = FALSE), alpha = 0.8) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
labs(y="Number", x="\n Year") +
scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) +
theme_minimal() +
theme(plot.title = element_text(hjust=0.5)) +
theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”
DATA %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
geom_boxplot(aes(fill=as.factor(stem)), outlier.shape = NA, alpha=0.9, color = "white") +
theme_minimal() +
labs(x = "\n Prevailing wage ($)", y = "Density \n") +
scale_y_continuous(labels = function(x){paste0(x / 1000, "K")}) +
scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018
DATA %>%
filter(year == 2018) %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>%
ggplot(aes(x = prevailing_wage, color = as.factor(stem), fill = as.factor(stem))) +
geom_density(adjust = 2, alpha = 0.7)+
theme_classic() +
labs(x = "\n Prevailing wage ($)", y = expression(Density~(10^{-3})), title = "Distribution of prevailing wage in 2018") +
scale_x_continuous(labels = function(x){paste0(x/1000, 'K')}) +
scale_y_continuous(labels = function(x){paste0(x * 1000, "")}) +
scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
theme(plot.title = element_text(hjust=0.5)) +
theme_minimal()

SLIDE 12 AND 13: bar plot: stem jobs
dt <- DATA %>%
mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "senior systems analyst jc60"), "senior systems analyst", job_title)) %>%
filter(stem == 1)
#
# dt %>%
# filter(year == 2017) %>%
# group_by(job_title) %>%
# summarise(n = n()) %>%
# arrange(-n) %>%
# slice(1:20) %>%
# mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
# arrange(n) %>%
# ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
# labs(y = "Number of Aplications", x = "Job Titles") +
# theme_minimal()
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
arrange(n) %>%
ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
labs(y = "Number of Aplications", x = "Job Titles")+
theme_minimal()+
theme(
legend.position = "none"
)

# original
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
arrange(n) %>%
ggbarplot("job_title", "n", fill = "#00B2E4", alpha = 0.8, orientation = "horiz", color = "white") +
labs(y = "Number of Aplications", x = "Job Titles") +
theme_minimal()

Slide 15
dt <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
arrange(-n)
p1 <- dt %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2)+
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "Applications Data related jobs", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal() +
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))
p1

slide 16
filtered_job <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Engineer", "Data Scientist","Data Analyst"))
filtered_job$data_job_title <- factor(filtered_job$data_job_title, levels = c("Data Analyst", "Business Analyst", "Data Engineer", "Data Scientist"), ordered = TRUE)
filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%
ggplot(aes(y = prevailing_wage, x = data_job_title)) +
geom_boxplot(fill = "#00B2E4", outlier.shape = NA, color = "white", width = 0.5) +
coord_cartesian(ylim = c(50000, 120000)) +
theme_minimal() +
labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
theme(plot.title = element_text(size = 1),
text = element_text(size = 12),
axis.title = element_text(size = 16),
axis.text.x= element_text(size = 10),
axis.text.y = element_text(size = 10)) +
theme(plot.title = element_text(hjust = 0.5))

Slide 17

Slide 17
Top Tech Companies and Their Trends
soc_top_tech <- c("Apple",
"Microsoft",
"Amazon",
"Facebook",
"Google",
"IBM",
"Cisco")
h1b_df %>%
filter(case_status == "certified") %>%
mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "Business Analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "Data Engineer", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data") & str_detect(job_title, "scientist"), "Data Scientist", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data") & str_detect(job_title, "analyst"), "Data Analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "machine|deep") & str_detect(job_title, "learning"), "Deep Learning & Machine Learning", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "Data Product Analyst", job_title)) %>%
filter(job_title %in% c("Business Analyst","Data Engineer","Deep Learning & Machine Learning","Data Analyst", "Data Scientist", "Data Product Analyst")) %>%
mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
ifelse(str_detect(employer_name,'amazon'),'Amazon',
ifelse(str_detect(employer_name,'cisco sys'),'Cisco',
ifelse(str_detect(employer_name,'facebook'),'Facebook',
ifelse(str_detect(employer_name,'google'),'Google',
ifelse(str_detect(employer_name, 'ibm'),'IBM','no')))))))) %>%
group_by(employer_name, year) %>%
summarise(tot = n()) %>%
filter(!employer_name %in% c("no", NA)) %>%
ungroup()%>%
ggplot()+
geom_line(aes(x = year, y = tot, color = employer_name), size = 1.05)+
labs( y = "Number of Applications", x = "Year", color = "Employer") +
theme_minimal()

NA
NA
Data jobs in top companies
filtered_job_all <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Analyst", "Data Engineer", "Data Scientist")) %>%
mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
ifelse(str_detect(employer_name,'amazon'),'Amazon',
ifelse(str_detect(employer_name,'facebook'),'Facebook',
ifelse(str_detect(employer_name,'google'),'Google',
ifelse(str_detect(employer_name, 'ibm'),'IBM',employer_name)))))))
#IBM
filtered_job_all %>%
filter(employer_name == 'IBM') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

NA
NA
Infosys
filtered_job_all %>%
filter(str_detect(employer_name, 'infosys')) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
#axis.text = element_text(size = 15),
#axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Microsoft
filtered_job_all %>%
filter(employer_name == 'Microsoft') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Amazon
filtered_job_all %>%
filter(employer_name == 'Amazon') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Deloitte
filtered_job_all %>%
filter(str_detect(employer_name, "deloitte")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Facebook
filtered_job_all %>%
filter(str_detect(employer_name, "Facebook")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Apple
filtered_job_all %>%
filter(str_detect(employer_name, "Apple")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Google
filtered_job_all %>%
filter(str_detect(employer_name, "Google")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Facebook
h1b_facebook <- h1b_df %>%
filter(employer_name == 'facebook') %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","Data Engineer",'research scientist')
ggplot(h1b_facebook, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Facebook",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_facebook, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))+
scale_color_discrete(labels = c("Data Engineer", "Data Scientist", "Research Scientist","Software Engineer"))

Amazon
h1b_amazon <- h1b_df %>%
filter(str_detect(employer_name,'amazon')) %>%
ungroup(data_job_title) %>%
mutate(job_title=ifelse(str_detect(data_job_title,'software development engineer'), 'software development engineer',
ifelse(str_detect(data_job_title,'technical program manager'), 'technical program manager',data_job_title)))%>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software development engineer","business analyst","Data Engineer","technical program manager")
ggplot(h1b_amazon, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Amazon",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_amazon, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Business Analyst", "Data Engineer", "Data Scientist","Software Development Engineer","Technical Program Manager"))

Microsoft
h1b_micro <- h1b_df %>%
filter(str_detect(employer_name,'microsoft')) %>%
ungroup(data_job_title) %>%
mutate(job_title=ifelse(str_detect(data_job_title,'software engineer|software development engineer'), 'software engineer',
ifelse(str_detect(data_job_title,'program manager'), 'program manager',data_job_title))) %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","program manager")
ggplot(h1b_micro, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Microsoft",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_micro, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Data Scientist","Program Manager","Software Engineer"))

Google
h1b_google <- h1b_df %>%
filter(str_detect(employer_name,'google'))
h1b_google <- h1b_google %>%
ungroup(job_title) %>%
mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>%
group_by(job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","program manager","product manager","business analyst")
ggplot(h1b_google, aes(x = year, y = n, group = job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Google",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_google, job_title %in% con),aes(col=job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Business Analyst", "Data Scientist","Product Manager","Program Manager", "Software Engineer"))

IBM
h1b_ibm <- h1b_df %>%
filter(str_detect(employer_name,'ibm'))
h1b_ibm <- h1b_ibm %>%
ungroup(job_title) %>%
mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>%
group_by(job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("consultant","application developer","it specialist","software engineer","project manager")
ggplot(h1b_ibm, aes(x = year, y = n, group = job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in IBM",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_minimal()+
theme(plot.title = element_text(hjust = 0.5))+
# geom_line(data = subset(h1b_ibm, job_title %in% con),aes(col=job_title),size=0.7)+
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))
Error in FUN(X[[i]], ...) : object 'data_job_title' not found

Uber
h1b_uber <- h1b_df %>%
filter(str_detect(employer_name,'uber')) %>%
ungroup(data_job_title) %>%
mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'Software Engineer',
data_job_title)) %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Software Engineer","Data Scientist","Data Analyst")
ggplot(h1b_uber, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Uber",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_uber, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))

Alluvia

bar plot:stem program in different job titles
DATA %>%
mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>%
filter(year == 2018) %>%
filter(stem == 1) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>%
labs(title = "stem program")
[[1]]
$title
[1] "stem program"
attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city
ggplot(points) +
geom_sf(data = state_maps, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 0.1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
legend.position = c(0,0), legend.justification = c(0,0))+
labs(x = "", y = "", title = "")

ggplot(points_ca) +
geom_sf(data = state_maps_ca, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_northeast) +
geom_sf(data = state_maps_northeast, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_midwest) +
geom_sf(data = state_maps_midwest, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_tn) +
geom_sf(data = state_maps_tn, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKIyBTRUNUSU9OIDI6IFNURU0KIyBTTElERSA5OiBTdGVtIGFuZCBub24tc3RlbSBoaXN0b2dyYW0KYGBge3IgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD0zfQpEQVRBICU+JQogIGdyb3VwX2J5KHllYXIsIHN0ZW0pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuLCBmaWxsID0gYXMuZmFjdG9yKHN0ZW0pKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHJldmVyc2UgPSBGQUxTRSksIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgbGFicyh5PSJOdW1iZXIiLCB4PSJcbiBZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHgvMTAwMCwgJ0snKX0pICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCiMgU0xJREUgMTA6IFNURU0gYW5kIG5vbi1TVEVNIGJveHBsb3Q6ICJQcmV2YWlsaW5nIHdhZ2UgYm94cGxvdCB0aHJvdWdob3V0IHllYXJzIgpgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNjAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSBwcmV2YWlsaW5nX3dhZ2UpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsPWFzLmZhY3RvcihzdGVtKSksIG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGE9MC45LCBjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLCB5ID0gIkRlbnNpdHkgXG4iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4IC8gMTAwMCwgIksiKX0pICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksIG5hbWUgPSAiIiwgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDQwMDAwLCAxMDAwMDApKQpgYGAKCgojIFNMSURFIDExOiBTdGVtIGFuZCBub24tc3RlbSBwcmV2YWlsaW5nIHdhZ2UgZGlzdHJpYnV0aW9uIGluIDIwMTgKYGBge3J9CkRBVEEgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lCiAgZmlsdGVyKHByZXZhaWxpbmdfd2FnZSA+PSAwICYgcHJldmFpbGluZ193YWdlIDw9IDQwMDAwMCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHByZXZhaWxpbmdfd2FnZSwgY29sb3IgPSBhcy5mYWN0b3Ioc3RlbSksIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9kZW5zaXR5KGFkanVzdCA9IDIsIGFscGhhID0gMC43KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICJcbiBQcmV2YWlsaW5nIHdhZ2UgKCQpIiwgeSA9IGV4cHJlc3Npb24oRGVuc2l0eX4oMTBeey0zfSkpLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgcHJldmFpbGluZyB3YWdlIGluIDIwMTgiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4LzEwMDAsICdLJyl9KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4ICogMTAwMCwgIiIpfSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyBTTElERSAxMiBBTkQgMTM6IGJhciBwbG90OiBzdGVtIGpvYnMKYGBge3J9CmR0IDwtIERBVEEgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiYnVzaW5lc3MgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiZGF0YSBlbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiZGF0YSBzY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAiZGF0YSBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLCAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2VuaW9yIHN5c3RlbXMgYW5hbHlzdCBqYzYwIiksICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIGZpbHRlcihzdGVtID09IDEpCiMgCiMgZHQgJT4lIAojICAgZmlsdGVyKHllYXIgPT0gMjAxNykgJT4lIAojICAgZ3JvdXBfYnkoam9iX3RpdGxlKSAlPiUgCiMgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiMgICBhcnJhbmdlKC1uKSAlPiUgCiMgICBzbGljZSgxOjIwKSAlPiUgCiMgICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQojICAgYXJyYW5nZShuKSAlPiUgCiMgICBnZ2JhcnBsb3QoImpvYl90aXRsZSIsICJuIiwgZmlsbCA9ICJjYXQiLCBwYWxldHRlID0gYygiI0ZDMjk2NyIsICIjMDBCMkU0IiksIGFscGhhID0gMC44LCBvcmllbnRhdGlvbiA9ICJob3JpeiIsIGNvbG9yID0gIndoaXRlIikgKwojICAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpICsKIyAgIHRoZW1lX21pbmltYWwoKQoKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gImNhdCIsIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwgYWxwaGEgPSAwLjgsIG9yaWVudGF0aW9uID0gImhvcml6IiwgY29sb3IgPSAid2hpdGUiKSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgCgoKIyBvcmlnaW5hbApkdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiAgYXJyYW5nZShuKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiIzAwQjJFNCIsIGFscGhhID0gMC44LCBvcmllbnRhdGlvbiA9ICJob3JpeiIsIGNvbG9yID0gIndoaXRlIikgKwogIGxhYnMoeSA9ICJOdW1iZXIgb2YgQXBsaWNhdGlvbnMiLCB4ID0gIkpvYiBUaXRsZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyBTbGlkZSAxNQpgYGB7cixmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpkdCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pIAoKcDEgPC0gZHQgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIkFwcGxpY2F0aW9ucyBEYXRhIHJlbGF0ZWQgam9icyIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCnAxCmBgYAoKIyBzbGlkZSAxNgoKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LSBmYWN0b3IoZmlsdGVyZWRfam9iJGRhdGFfam9iX3RpdGxlLCBsZXZlbHMgPSBjKCJEYXRhIEFuYWx5c3QiLCAiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiksIG9yZGVyZWQgPSBUUlVFKQoKCmZpbHRlcmVkX2pvYiAlPiUgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHJldmFpbGluZ193YWdlKSkKZmlsdGVyZWRfam9iICU+JSAgCiAgZ2dwbG90KGFlcyh5ID0gcHJldmFpbGluZ193YWdlLCB4ID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzAwQjJFNCIsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAid2hpdGUiLCB3aWR0aCA9IDAuNSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg1MDAwMCwgMTIwMDAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlxuIEpvYiB0aXRsZSIsIHkgPSAiUHJldmFpbGluZyB3YWdlIChwZXIgeWVhcikgXG4iLCB0aXRsZSA9ICJQcmV2YWlsaW5nIHdhZ2VzIGluIGRhdGEgcmVsYXRlZCBqb2JzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyBTbGlkZSAxNwpgYGB7cn0KCnRvcF9jb20gPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIHVuZ3JvdXAoKQoKdG9wX2NvbSA8LXRvcF9jb20kZW1wbG95ZXJfbmFtZSAKCnNwYV9kYXRhIDwtIERBVEEgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICVpbiUgdG9wX2NvbSkgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICE9ICJjYXBnZW1pbmkgYW1lcmljYSBpbmMiKSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpIAoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KHNwYV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGVtcGxveWVyX25hbWUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnMoeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICIiKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIGdlb21fbGluZShkYXRhID0gc3Vic2V0KHNwYV9kYXRhLCBlbXBsb3llcl9uYW1lICVpbiUgY29uKSxhZXMoY29sPWVtcGxveWVyX25hbWUpLHNpemU9MS4yKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15Q29sb3IsIGJyZWFrcyA9IGMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpLCBsYWJlbHMgPSBjKCJJbmZvc3lzIExpbWl0ZWQiLCAiRGVsb2l0dGUgQ29uc3VsdGluZyIsIkFtYXpvbiIsIkZhY2Vib29rIiwgIklCTSIpKSAgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgpgYGAKCgojIFNsaWRlIDE3CiMgVG9wIFRlY2ggQ29tcGFuaWVzIGFuZCBUaGVpciBUcmVuZHMKYGBge3J9CnNvY190b3BfdGVjaCA8LSBjKCJBcHBsZSIsCiAgICAgICAgICAgICAgICAgICJNaWNyb3NvZnQiLAogICAgICAgICAgICAgICAgICAiQW1hem9uIiwKICAgICAgICAgICAgICAgICAgIkZhY2Vib29rIiwKICAgICAgICAgICAgICAgICAgIkdvb2dsZSIsCiAgICAgICAgICAgICAgICAgICJJQk0iLAogICAgICAgICAgICAgICAgICAiQ2lzY28iKQoKCmgxYl9kZiAlPiUgCiAgZmlsdGVyKGNhc2Vfc3RhdHVzID09ICAiY2VydGlmaWVkIikgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJCdXNpbmVzcyBBbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJEYXRhIEVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiRGF0YSBTY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdCIpLCAiRGF0YSBBbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibGVhcm5pbmciKSwgIkRlZXAgTGVhcm5pbmcgJiBNYWNoaW5lIExlYXJuaW5nIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJwcm9kdWN0IikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZW5naW5lZXJ8ZGF0YSIpLCAiRGF0YSBQcm9kdWN0IEFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgZmlsdGVyKGpvYl90aXRsZSAlaW4lIGMoIkJ1c2luZXNzIEFuYWx5c3QiLCJEYXRhIEVuZ2luZWVyIiwiRGVlcCBMZWFybmluZyAmIE1hY2hpbmUgTGVhcm5pbmciLCJEYXRhIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiLCAiRGF0YSBQcm9kdWN0IEFuYWx5c3QiKSkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhcHBsZScpLCAnQXBwbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ21pY3Jvc29mdCcpLCAnTWljcm9zb2Z0JywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhbWF6b24nKSwnQW1hem9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdjaXNjbyBzeXMnKSwnQ2lzY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2ZhY2Vib29rJyksJ0ZhY2Vib29rJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSwnR29vZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJyksJ0lCTScsJ25vJykpKSkpKSkpICU+JSAKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKHRvdCA9IG4oKSkgJT4lIAogIGZpbHRlcighZW1wbG95ZXJfbmFtZSAlaW4lIGMoIm5vIiwgTkEpKSAlPiUgCiAgdW5ncm91cCgpJT4lIAogIGdncGxvdCgpKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjA1KSsKICBsYWJzKCB5ID0gIk51bWJlciBvZiBBcHBsaWNhdGlvbnMiLCB4ID0gIlllYXIiLCBjb2xvciA9ICJFbXBsb3llciIpICsKICB0aGVtZV9taW5pbWFsKCkgCgoKYGBgCgoKIyBEYXRhIGpvYnMgaW4gdG9wIGNvbXBhbmllcyAKCmBgYHtyfQoKZmlsdGVyZWRfam9iX2FsbCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lIAogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZmFjZWJvb2snKSwnRmFjZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpLCdHb29nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwnSUJNJyxlbXBsb3llcl9uYW1lKSkpKSkpKSAKICAKYGBgCgojSUJNCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgoKYGBgCgojIEluZm9zeXMKYGBge3J9CgpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaW5mb3N5cycpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICAjYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgI2F4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQoKYGBgCgojIE1pY3Jvc29mdApgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ01pY3Jvc29mdCcpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgQW1hem9uCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnQW1hem9uJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBEZWxvaXR0ZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgImRlbG9pdHRlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgRmFjZWJvb2sKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJGYWNlYm9vayIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEFwcGxlCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiQXBwbGUiKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBHb29nbGUKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJHb29nbGUiKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyMgRmFjZWJvb2sKCmBgYHtyfQpoMWJfZmFjZWJvb2sgPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnZmFjZWJvb2snKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCiAgCmBgYAoKCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJEYXRhIEVuZ2luZWVyIiwncmVzZWFyY2ggc2NpZW50aXN0JykKZ2dwbG90KGgxYl9mYWNlYm9vaywgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gRmFjZWJvb2siLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9mYWNlYm9vaywgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiLCAiUmVzZWFyY2ggU2NpZW50aXN0IiwiU29mdHdhcmUgRW5naW5lZXIiKSkKCmBgYAoKIyMgQW1hem9uCgpgYGB7cn0KCmgxYl9hbWF6b24gPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhbWF6b24nKSkgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCdzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlcicpLCAnc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInLCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCd0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyJyksICd0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyJyxkYXRhX2pvYl90aXRsZSkpKSU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyIiwiYnVzaW5lc3MgYW5hbHlzdCIsIkRhdGEgRW5naW5lZXIiLCJ0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyIikKZ2dwbG90KGgxYl9hbWF6b24sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIEFtYXpvbiIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2FtYXpvbiwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiLCJTb2Z0d2FyZSBEZXZlbG9wbWVudCBFbmdpbmVlciIsIlRlY2huaWNhbCBQcm9ncmFtIE1hbmFnZXIiKSkKYGBgCgoKIyMgTWljcm9zb2Z0CgpgYGB7cn0KaDFiX21pY3JvIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnbWljcm9zb2Z0JykpICU+JSAKICB1bmdyb3VwKGRhdGFfam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXJ8c29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywgCiAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwncHJvZ3JhbSBtYW5hZ2VyJyksICdwcm9ncmFtIG1hbmFnZXInLGRhdGFfam9iX3RpdGxlKSkpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKICAKYGBgCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJwcm9ncmFtIG1hbmFnZXIiKQpnZ3Bsb3QoaDFiX21pY3JvLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBNaWNyb3NvZnQiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9taWNybywgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJEYXRhIFNjaWVudGlzdCIsIlByb2dyYW0gTWFuYWdlciIsIlNvZnR3YXJlIEVuZ2luZWVyIikpCmBgYAoKCiMjIEdvb2dsZQoKYGBge3J9CmgxYl9nb29nbGUgPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSkgCiAgCmBgYAoKYGBge3J9CmgxYl9nb29nbGUgPC0gaDFiX2dvb2dsZSAlPiUgCiAgdW5ncm91cChqb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsJ2hhcmR3YXJlIGVuZ2luZWVyJyksICdoYXJkd2FyZSBlbmdpbmVlcicsam9iX3RpdGxlKSkpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvZ3JhbSBtYW5hZ2VyIiwicHJvZHVjdCBtYW5hZ2VyIiwiYnVzaW5lc3MgYW5hbHlzdCIpCmdncGxvdChoMWJfZ29vZ2xlLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGpvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gR29vZ2xlIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfZ29vZ2xlLCBqb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9am9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIsIlByb2R1Y3QgTWFuYWdlciIsIlByb2dyYW0gTWFuYWdlciIsICJTb2Z0d2FyZSBFbmdpbmVlciIpKQpgYGAKCgojIyBJQk0gCgpgYGB7cn0KaDFiX2libSA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2libScpKSAKICAKYGBgCgpgYGB7cn0KaDFiX2libSA8LSBoMWJfaWJtICU+JSAKICB1bmdyb3VwKGpvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCdzb2Z0d2FyZSBlbmdpbmVlcicpLCAnc29mdHdhcmUgZW5naW5lZXInLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnaGFyZHdhcmUgZW5naW5lZXInKSwgJ2hhcmR3YXJlIGVuZ2luZWVyJyxqb2JfdGl0bGUpKSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKYGBgCgpgYGB7cn0KY29uPWMoImNvbnN1bHRhbnQiLCJhcHBsaWNhdGlvbiBkZXZlbG9wZXIiLCJpdCBzcGVjaWFsaXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJwcm9qZWN0IG1hbmFnZXIiKQpnZ3Bsb3QoaDFiX2libSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBqb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIElCTSIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfaWJtLCBqb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9am9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKQpgYGAKCiMjIFViZXIKCmBgYHtyfQpoMWJfdWJlciA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ3ViZXInKSkgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyJyksICdTb2Z0d2FyZSBFbmdpbmVlcicsIAogICAgICAgIGRhdGFfam9iX3RpdGxlKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyfQpjb249YygiU29mdHdhcmUgRW5naW5lZXIiLCJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpCmdncGxvdChoMWJfdWJlciwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gVWJlciIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX3ViZXIsIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKQpgYGAKCgojIyBBbGx1dmlhCmBgYHtyLGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTIuN30KZmlsdGVyZWRfam9iIDwtIERBVEEgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKQoKCnRvcF8xMF9zdGF0ZSA8LSBmaWx0ZXJlZF9qb2IgJT4lIAogIGdyb3VwX2J5KHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSAKICBzbGljZSgxOjEwKSAKCmZsb3dzIDwtIGZpbHRlcmVkX2pvYiAlPiUgCiAgZmlsdGVyKHdvcmtzaXRlX3N0YXRlX2FiYiAlaW4lIHRvcF8xMF9zdGF0ZSR3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwKICAgICAgICAgICB3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCgpnZ3Bsb3QoZmxvd3MsIGFlcyh5ID1jb3VudCwgYXhpczE9ZGF0YV9qb2JfdGl0bGUsIGF4aXMyPXdvcmtzaXRlX3N0YXRlX2FiYikpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS84LCBmaWxsID0gIiMwRjJBNDgiLCBjb2xvciA9ICJncmV5IiwgYWxwaGEgPSAwLjkpICsKICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpICsKICBsYWJzKHg9IiIseT0iIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZT1OVUxMKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkpvYiB0aXRsZSIsICJTdGF0ZSIpLCBleHBhbmQgPSBjKC4wNSwgLjA1KSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpKSsKICB0aGVtZShsaW5lID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgojIyBiYXIgcGxvdDpzdGVtIHByb2dyYW0gaW4gZGlmZmVyZW50IGpvYiB0aXRsZXMKYGBge3J9CkRBVEEgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiYnVzaW5lc3MgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiZGF0YSBlbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiZGF0YSBzY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAiZGF0YSBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLCAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUgCiAgZmlsdGVyKHN0ZW0gPT0gMSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44LCBzb3J0LnZhbCA9ICJhc2MiLCBvcmllbnRhdGlvbiA9ICJob3JpeiIpICU+JSAKICBsYWJzKHRpdGxlID0gInN0ZW0gcHJvZ3JhbSIpCmBgYAoKIyBNQVAgLSBkYXRhIGpvYiB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBpbiBlYWNoIGNpdHkgCmBgYHtyfQpnZ3Bsb3QocG9pbnRzKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHMsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAwLjEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkpKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfY2EpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19jYSwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24pLCB5ID0gaml0dGVyKGxhdCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19ub3J0aGVhc3QpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19ub3J0aGVhc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2IpLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbWlkd2VzdCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c190bikgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX3RuLCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiKQpgYGA=